AWS Glue Data Quality(プレビュー)でデータ品質検査を試してみた
データアナリティクス事業本部インテグレーション部コンサルティングチーム・新納(にいの)です。
昨年末に開催されたAWS re:Inventにて、データ品質の検査を可能にする新機能AWS Glue Data Qualityが発表されました。本エントリでは実際にどんなことができるのかご紹介します。
なお、本機能は2023年1月現在のパブリックプレビュー段階のものであり、GA(General Availability:一般利用可能)なステータスとなった際には仕様が変更されている可能性があることをご留意ください。
AWS Glue Data Qualityとは
ユーザーが定義したルールに従って、データの品質検査を実施できる機能です。AWS Glue Studioではビジュアルエディタから「Evaluate Data Quality」ノードを追加し、DQDL(Data Quality Definition Language)という独自の言語で定義します。(後述しますが、独自の言語とは言ってもDQDLビルダーもあり、それほど複雑なものではないので学習コストは低いです)
データ分析の最終的なゴールは分析結果をもとに意思決定を行うことです。適切な意思決定には信頼できる正確なデータを使う必要がありますが、データというものは様々な理由で変化し、意図しない形になるケースがあります。
そこでデータの品質をモニタリングし、問題を検出して品質改善につなげて正確なデータであることを担保します。これまでは自前で品質検査の仕組みを作る必要がありましたが、AWS Glue Data Qualityの登場によりマネージドな環境で品質検査ができるようになりました。
データ品質検査をしてみる
公式ドキュメントに記載されたチュートリアルに従って設定をします。
Evaluate Data Qualityノードを追加する
AWS Glue Job Studioのジョブ作成画面からビジュアルジョブエディタを選びます。Actionのドロップダウンリストから、他のトランスフォームのノードと同じようにEvaluate Data Qualityノードを追加できます。
DQDLで品質検査ルールを定義する
Evaluate Data Qualityノードを選択すると右ペインに設定画面が表示されます。
Transformタブに移動し、DQDL rule builderでルールを定義します。Rule Typesから各ルールタイプが選択可能です。+ボタンから選択したルールタイプが右側のルールエディタに追加されます。今回は「order_id
というカラムの80%以上にデータが存在している」ルールを設定しました。
Shemaタブにはインプットデータのカラム名とデータ型が一覧で確認できるようになっています。+ボタンを押すことでルールエディタにカラム名を挿入できます。
DQDLで他にどんな定義ができるのかは後述します。
アクションとアウトプットを設定する
Data quality actionsからは以下の設定が可能です。
- 実行結果をCloudWatchにパブリッシュ
- インプットデータが品質検査ルールを満たさなかった場合にジョブを停止
- ターゲットデータをロードせずに異常終了するか、ロードした後に異常終了するか選択可能
Data quality transform outputでは、データ品質検査の出力内容が設定できます。
- Original Data
- オリジナルのインプットデータを出力する
- 品質問題が検出されたときにジョブを停止させたい場合に最適
- Data quality results
- 設定されたルールと合格または不合格のステータスを出力
- 品質問題が検出されたときに独自にアクションを取りたい場合に最適
Data quality output settingsのオプションで品質検査の結果を任意のS3バケットにアウトプットできます。何も指定しない場合は後述するData qualityタブから結果csvファイルをダウンロードできます。
品質検査結果を確認する
ジョブ実行が完了するとData qualityタブから品質検査の結果が確認できました。どのルールに合格・不合格したのかをコンソール上で確認できるほか、結果をcsv形式でダウンロードもできます。
期間を指定して結果を表示させることも可能です。
前述したData quality output settingsでアウトプット先のS3バケットを指定していたので、以下のような形で出力されていました。
S3 Selectすると品質検査の結果が取得できました。
{ "jobName": "DataQualityTutorial", "jobRunId": "jr_e4c57ce01f2bb7872b7d7f29aa78e4e52cc565618cce0be6a5c96f20ee8b83c5", "evaluationContext": "EvaluateDataQuality_node1673947412652", "evaluationStartedOn": "2023-01-18 06:02:37.727", "evaluationCompletedOn": "2023-01-18 06:02:45.74", "rule": "Completeness \"order_id\" > 0.8", "outcome": "Passed", "failureReason": null, "evaluatedMetrics": "{Column.order_id.Completeness -> 1.0}" }
DQDLで定義できるルール
基本的な操作方法はざっくりと把握できたところで、他にどんなルールが定義可能かまとめました。以下を参考にしており、記述例もドキュメント記載のものを引用しています。
DQDLシンタックス
DQDLでルールを定義する際は以下のように記述します。ルールが複数ある場合はカンマで区切って定義します。
Rules = [ IsComplete "order-id", IsUnique "order-id" ]
DQDLで定義可能なルール
ColumnCorrelation
2つの列の相関をチェックします。AWS Glue Data Qualityは、ピアソン相関係数を用いて2つのカラム間の線形相関を測定します。結果は-1から1の間の数値で、関係の強さと方向を測定します。
例:身長と体重の相関係数が強い正の相関(係数値が0.8以上)を持つかどうかをチェック
ColumnCorrelation "height" "weight" > 0.8
ColumnExists
カラムが存在するかどうかチェックします。
例:Middle_Name
カラムが存在するかどうかチェック
ColumnExists "Middle_Name"
ColumnLength
値の長さが指定した数値と合致するかチェックします。
例:Postal_Code
の値が5桁かどうかチェック
ColumnLength "Postal_Code" = 5
ColumnValues
カラムの値に対して、指定した式と合致するかチェックします。正規表現や式を利用でき、汎用的に使えるルールです。利用可能な条件式はExpressionsをご参照ください。
例:与えられた値の集合のどれかに一致しているかどうかチェック
ColumnValues "Country" in [ "US", "CA", "UK" ]
例:正規表現と合致するかチェック
ColumnValues "First_Name" matches "[a-ZA-Z]*"
例:日付が指定した条件式と合致するかチェック
ColumnValues "Load_Date" > (now() - 3 days)
例:数値条件に合致するかチェック
ColumnValues "Customer_ID" between 1 and 2000
Completeness
カラム内の完全な値(NULLではない値)の割合をチェックします。
例:カラムの値(First_Name
)の95%以上がNULLではない値であるかチェック
Completeness "First_Name" > 0.95
CustomSql
データセットに対してカスタムSQL文を実行し、その戻り値を指定された式と合致するかチェックします。注意すべき点として、SQL文は単一の数値を返す必要があります。
例:データセットのレコード数が10~20件の間かどうかチェック
例の通り、FROM句にはデータセットの名前ではなくprimary
を指定します。ビジュアルエディタで品質検査を実施する場合、primary
はEvaluateDataQuality.apply()
に渡されるDynamicFrame
を表します。AWS Glue Data Catalogを使用してテーブルに対してデータ品質タスクを実行する場合はテーブルを表しています。
CustomSql "select count(*) from primary" between 10 and 20
DataFreshness
データの鮮度を評価します。ここで指定できるカラムのデータ型はDate型のみ。
例:Order_Date
が24時間以内かどうかチェック
DataFreshness "Order_Date" <= 24 hours
DistinctValuesCount
カラム内の異なる値の数をチェックします。
例:State
カラムに3つ以上の異なる値が含まれているかチェック
DistinctValuesCount "State" > 3
Entropy
エントロピー値が指定した式に一致するかどうかをチェックします。エントロピーはメッセージに含まれる情報のレベルを測定します。列の値に対する確率分布があるとき、エントロピーは値を識別するために何ビットが必要か表します。ものすごくざっくり説明すると、おそらくカラムの値がどれだけバラバラなのかチェックできるのだと思われます。(エントロピー値が大きければ大きいほど情報量が少なく、あまり意味のなさないデータとなりますが、エントロピー値が減少すると情報量が増えます。)
例:Star_Rating
カラムのエントロピー値が1より大きいかどうかをチェック
Entropy "Star_Rating" > 1
IsComplete
値がすべて完全であるかどうか(すべて非NULLであるかどうか)をチェックします。
例:email
カラムにNULL値が含まれていないかどうかチェック
IsComplete "email"
IsPrimaryKey
対象カラムが主キーを含むか(カラムの値がすべて一意で完全であるかどうか)チェックします。
例:Customer_ID
が主キーを含むかチェック
IsPrimaryKey "Customer_ID"
IsUnique
カラム内のすべての値が一意であるかどうかチェックし、bool値を返します。
例:email
カラムの値がすべて一意であるかどうかチェック
IsUnique "email"
Mean
対象カラムのすべての値の平均が指定された式に一致するかどうかをチェックします。
例:Star_Rating
カラムのすべての値の平均が3を超えるかどうかチェック
Mean "Star_Rating" > 3
RowCount
データセットの行数を指定された式でチェックします。
例:インプットデータの行数が10~100の間であるかどうかチェック
RowCount between 10 and 100
StandardDeviation
対象カラムの標準偏差を指定された式でチェックします。
例:Star_Rating
カラムのすべての値の標準偏差が1.5以下であるかどうかチェック
StandardDeviation "Star_Rating" < 1.5
Sum
対象カラムのすべての値の合計を指定した式でチェックします。
例:transaction_total
カラムのすべての値の合計が500000以上であるかチェック
Sum "transaction_total" > 500000
Uniqueness
対象カラムの一意な値の割合を指定した式でチェックします。
例:email
カラムの一意な値の割合が100%であるかチェック
Uniqueness "email" = 1.0
UniqueValueRatio
カラムの一意な値の比率をチェックします。例えば、[a,a,b]
という集合は一位の値a
と二つの異なる値a
、b
から構成されます。この場合、一意な値の比率は½ = 0.5となります。
例:test_score
の一意な値の比率が0~50%の範囲であるかチェック
UniqueValueRatio "test_score" between 0 and 0.5
最後に
パブリックプレビューのAWS Glue Data Qualityで品質検査を実施してみました。2023年1月現在、以下の制限があることをご留意ください。(冒頭でも言及した通り、一般利用開始された際の使用とは異なる可能性があります)
- データソースはS3のみ対応
- Glue 3.0でのみ対応
- ネストされたデータソースやリスト型データソースは評価できない
- プレビューは以下のリージョンで使用可能
- US East (Ohio)
- US East (N. Virginia)
- US West (Oregon)
- Asia Pacific (Tokyo)
- Europe (Ireland)